#pragma once
#include "tcp_connect.h"
#include "io_event_type.h"
#include "uv_timer.h"
typedef std::function<void(tcp_connect* client, e_io_evt evt)> conn_cb;


class DllExport tcp_client :public tcp_connect
{
public:
	tcp_client();
	virtual ~tcp_client();
	/**
	* @brief 建立连接
	* @param ip	ip地址
	* @param port	端口
	* @note 注意
	* @see
	*/
	void connect(char* ip, size_t port);
	/**
	* @brief 连接状态回调
	* @param conncb	回调函数指针
	* @return 无
	* @note 注意
	* @see
	*/
	void on_conn_status_cb(conn_cb conncb){ _conn_cb = conncb; }
	/**
	* @brief 设置连接重连时间
	* @param ms 毫秒
	* @return 无
	* @note 注意
	* @see
	*/
	void set_reconn_interal(size_t ms){ _interanl_ms = ms; }
	/**
	 * @brief 处理连接状态
	 * @param evt 事件类型	 
	 * @return 无
	 * @note 注意
	 * @see  
	 */
	void process_conn_status(e_io_evt evt);
	/**
	 * @brief 处理重连 	 
	 * @return 无
	 * @note 注意
	 * @see  
	 */
	void process_reconn();
	/**
	 * @brief 处理连接断开 
	 * @param uv_handle_t* handle	 
	 * @return 无
	 * @note 注意
	 * @see  
	 */
	virtual void process_on_close(uv_handle_t* handle);
private:
	void free_ptr();
private:
	uv_tcp_t* _uvtcp=nullptr;
	uv_connect_t* _connect=nullptr;
	std::string _perrip;
	int _perrport;
	uv_timer _uv_timer;
	int _interanl_ms;
	conn_cb _conn_cb;
	bool _bconnstatus = false;
};

